package xkp.lesson4;

public class Demo2 {
	
	public static void main(String[] args) {
		//接口不能直接实例化对象，必须用具体的子类才能实例化
		//MyInterface interface1 = new MyInterface();
		
		//局部内部类---是一个具体的类
		class MyClass implements MyInterface{

			@Override
			public void fun() {
				System.out.println("你好");
				
			}
		}
		MyInterface myInterface = new MyClass();
		myInterface.fun();
		
		//因为局部内部类像局部变量一样，都是临时使用一次
		//对于临时使用的情况，没有必要专门创建一种数据类型
		//此处使用的是匿名内部类，难点
		//在new关键字处，调用了构造方法的同时，顺便重写了接口中的抽象方法
		//就相当于创建了一个没有名称的类
		MyInterface interface2 = new MyInterface() {
			//一般在定义子类时才会重写父类的方法
			//重写只发生在子类与父类之间
			//此处儿子没有名称
			//所以称之为匿名内部类
			@Override
			public void fun() {
				System.out.println("你好，我是匿名内部类中的方法。。。。。。。");
			}
		};
		
		MyInterface interface3 = new MyInterface() {
			@Override
			public void fun() {
				System.out.println("我是第二个匿名内部类");
				
			}
		};
		interface2.fun();
		interface3.fun();
		//目前大家依然感觉匿名内部类使用很不方便
		//在JDK8新特性中我们会使用Lambda表达式优化
		/*
		 * MyInterface interface4 = ()->System.out.println("哈哈,我是Lambad表达式优化，我要替代匿名" +
		 * "内部类"); interface4.fun();
		 */
	}
}
